#ifndef _FOC_HALL_H
#define _FOC_HALL_H

#include <stdbool.h>
#include <stdint.h>
#include "foc_type.h"
#include "foc_filter.h"

#define     HALL_DEBUG  0

/*未校准的霍尔6个区域电角度*/
#define     _60_RAD            1.0471975511965977f
#define     _120_RAD           2.0943951023931954f
#define     _180_RAD           3.1415926535897932f
#define     _240_RAD           4.1887902047863909f
#define     _300_RAD           5.2359877559829887f
#define     _360_OR_0_RAD      0.0f    /*360° 或 0°*/

/********************************下面是个别电机调试出来的霍尔参数********************************************/
/* 正转 */
/*校准得到的位置*/
#define     _60_RAD_CALIB       1.36268532f
#define     _120_RAD_CALIB      2.34578514f
#define     _180_RAD_CALIB      3.15171742f
#define     _240_RAD_CALIB      4.50899935f
#define     _300_RAD_CALIB      5.50435638f
#define     _360_OR_0_RAD_CALIB        0.0f           /*360° 或 0°*/
/*扇区的大小*/
#define     HALL_SECTOR_0       1.36268532f
#define     HALL_SECTOR_1       0.983099818f
#define     HALL_SECTOR_2       0.805932224f
#define     HALL_SECTOR_3       1.3572818f
#define     HALL_SECTOR_4       0.995357156f
#define     HALL_SECTOR_5       0.778828979f

/*反转*/
/*校准得到的位置*/
#define     _60_RAD_CALIB_C       1.01931787f
#define     _120_RAD_CALIB_C      1.8267622f
#define     _180_RAD_CALIB_C      3.14416599f
#define     _240_RAD_CALIB_C      4.17973375f
#define     _300_RAD_CALIB_C      4.95671272f
#define     _360_OR_0_RAD_CALIB_C        0.0f           /*360° 或 0°*/
/*扇区的大小*/
#define     HALL_SECTOR_0_C       1.01931787f
#define     HALL_SECTOR_1_C       0.807444274f
#define     HALL_SECTOR_2_C       1.31740391f
#define     HALL_SECTOR_3_C       1.03556788f
#define     HALL_SECTOR_4_C       0.776979029f
#define     HALL_SECTOR_5_C       1.32647204f
/****************************************************************************/

/*霍尔结构体*/
typedef struct{
    float foc_freq;                                 /*foc执行频率*/
    float hall_freq;                                /*霍尔定时器频率*/

    SPEED_t speed;
    float PhaseShift;                               /*与0°之间的偏移值*/

    float Sector_ElAngle;                           /*当前的扇区起始角度*/
    float Sector_ElAngle_Sum;                       /*扇区积分的电角度*/
    float Sector_CompIntegral;                      /*扇区补偿积分*/
    float Sector_CompDifferential[6];               /*扇区补偿微分*/
    float AvrElSpeed;                               /*平均电角度转速rad/s*/
    float AvrElSpeedDpp;                            /*平均的dpp, 也就是每个foc周期内增加的电角度*/

    int8_t sector;                                  /*第几个扇区*/
    int8_t sector_pre;                              /*上一个扇区*/

    float sector_tick[6];                           /*每个扇区内的定时器滴答值*/
    float sector_size[6];                           /*每个霍尔区间的大小: 单位:弧度*/
    float sector_pos[6];                            /*每个霍尔区间的起始位置*/
    float sector_size_c[6];                         /*反向时每个霍尔区间的大小: 单位:弧度*/
    float sector_pos_c[6];                          /*反向时每个霍尔区间的起始位置*/

    /*扇区周期计算*/
    MOVE_FILTER_t Period_filter;                    /*扇区时间计算的滑动滤波器*/
    MOVE_FILTER_t Speed_filter;                     /*速度计算的滑动滤波器*/

#if HALL_DEBUG
    float ElSpeed_sector[6];                            /*每个扇区内的速度*/
    MOVE_FILTER_t hall_sector_tick_filter[6];           /*每个扇区时间的滑动滤波器*/
    float hall_sector_size_debug[6];                    /*每个霍尔区间的大小: 单位:弧度*/
    float hall_sector_pos_debug[6];                     /*每个霍尔区间的起始位置*/
#endif

}FOC_HALL_t;

void FOC_HALL_CC_IRQ_Handler(FOC_HALL_t *foc_hall);
float FOC_HALL_Angle_Calc(FOC_HALL_t *foc_hall);
void FOC_Hall_Speed_Calc(FOC_HALL_t *foc_hall);
void FOC_HALL_Init(FOC_HALL_t *foc_hall, uint32_t hall_freq, uint32_t foc_freq, uint32_t pole_pairs);

#endif
